import HelloWorldExpoModules from "hello-world-expo-modules"

/**
 * 单文件上传参数
 */
export interface UploadFileOptions {
  /**
   * 存储桶名称（形如 "examplebucket-1250000000"）
   * 默认为 "pixel-cat-1318686313"
   */
  bucket?: string
  /**
   * 对象键（文件在 COS 上的完整路径）
   */
  key?: string
  /**
   * 本地文件路径
   */
  filePath?: string
  /**
   * 区域（如 "ap-shanghai"）
   * 默认为 "ap-shanghai"
   */
  region?: string
}

/**
 * 批量上传参数
 */
export interface UploadFilesOptions {
  /**
   * 存储桶名称（形如 "examplebucket-1250000000"）
   * 默认为 "pixel-cat-1318686313"
   */
  bucket?: string
  /**
   * 对象键前缀（可用于存放在同一目录下）
   */
  folder?: string
  /**
   * 多个本地文件路径
   */
  filePaths?: string[]
  /**
   * 区域（如 "ap-shanghai"）
   * 默认为 "ap-shanghai"
   */
  region?: string
}

/**
 * 上传单个文件
 * @param options 配置项
 */
export async function uploadFile(options: UploadFileOptions = {}): Promise<void> {
  const {
    bucket = "pixel-cat-1318686313", // 默认值
    region = "ap-shanghai", // 默认值
    key,
    filePath,
  } = options

  if (!key) {
    throw new Error("uploadFile: 'key' is required.")
  }
  if (!filePath) {
    throw new Error("uploadFile: 'filePath' is required.")
  }

  try {
    const res = await HelloWorldExpoModules.putObjectAsync(bucket, key, region, filePath)
    console.log("文件上传成功", res)
  } catch (error) {
    console.error("文件上传失败: ", error)
    throw error
  }
}

/**
 * 批量上传多个文件
 * @param options 配置项
 */
export async function uploadFiles(options: UploadFilesOptions = {}): Promise<void> {
  const {
    bucket = "pixel-cat-1318686313", // 默认值
    region = "ap-shanghai", // 默认值
    folder,
    filePaths = [],
  } = options
  console.log("region", region)
  if (!folder) {
    throw new Error("uploadFiles: 'folder' is required.")
  }
  if (filePaths.length === 0) {
    console.warn("uploadFiles: 'filePaths' is empty, 无可上传的文件")
    return
  }

  try {
    const res = await HelloWorldExpoModules.batchUploadAsync(bucket, folder, region, filePaths)
    console.log("批量文件上传成功", res)
    return res
  } catch (error) {
    console.error("批量文件上传失败: ", error)
    throw error
  }
}
